iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0
自我挑戰組

試煉之地 Leetcode 的挑戰系列 第 6

Leetcode 挑戰 Day 06 [66. Plus One]

  • 分享至 

  • xImage
  •  

66. Plus One


今天這一題相對單純、簡單一些,但當中也有一些小技巧和觀念,還是蠻值得一看的!

題目


You are given a large integer represented as an integer array digits, where each digits[i] is the ith digit of the integer. The digits are ordered from most significant to least significant in left-to-right order. The large integer does not contain any leading 0's.

Increment the large integer by one and return the resulting array of digits.

Example 1:
Input: digits = [1,2,3]
Output: [1,2,4]
Explanation: The array represents the integer 123.
Incrementing by one gives 123 + 1 = 124.
Thus, the result should be [1,2,4].

Example 2:
Input: digits = [4,3,2,1]
Output: [4,3,2,2]
Explanation: The array represents the integer 4321.
Incrementing by one gives 4321 + 1 = 4322.
Thus, the result should be [4,3,2,2].

Example 3:
Input: digits = [0]
Output: [1]
Explanation: The array represents the integer 0.
Incrementing by one gives 0 + 1 = 1.
Thus, the result should be [1].

Example 4:
Input: digits = [9]
Output: [1,0]
Explanation: The array represents the integer 9.
Incrementing by one gives 9 + 1 = 10.
Thus, the result should be [1,0].

這題的意思也相對簡單明暸,題目會給我們一個陣列,當中的元素是整數型態,他希望我們能夠把這整個陣列當成一個整數來看,並且對其加一,最後再以陣列的型式回傳。以例子來看,[2,9,9,9]會變成[3,0,0,0],[2,8,7,6] => [2,8,7,7]。

One-line in python


在python中我們可用非常簡潔的寫法,就能達到題目的要求,以下這段程式碼的邏輯就是,先將陣列中的整數換成字串型態,接著再把他們合併,合併後再變成整數型態,再加一,而後再把這些變成字串後再變成陣列,雖然這邊更正確的事要再把其中元素換回整數,不過Leetcode測資似乎沒有檢查到這部分。

以下為python3的程式碼

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        return list(str(int("".join([str(i) for i in digits]))+1))

Faster Solution


然而,上述那種方法雖然很容易理解,也很簡潔,但對電腦來說實在是稍嫌慢了一些,因為在轉換字串與合併字串,整數再轉回字串,都耗費了許多時間,以下這種解法,最多只要跑一次迴圈就能達成的解法,甚至有時候可以更快。

簡單來說就是我們不把陣列換成整數,我們直接對陣列中的元素作處理,從最後一個開始,如果走訪到的該元素是9那就變成0,而且迴圈要繼續,如果是9以外的數,那我們就加一,直接return當下的陣列,就是題目所求。但如果迴圈全部跑完,卻還沒return,就代表陣列中每個元素都是9,那我們就必須陣列開頭的地方插入1,這樣才符合要求!

以下是C++的程式碼

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        for(int i=digits.size()-1;i>-1;i--){
            if(digits[i] == 9){
                digits[i] = 0;
            }
            else{
                digits[i] = digits[i] + 1;
                return digits;
            }
         }
        digits.insert(digits.begin(), 1);
        return digits;
    }
};

上一篇
Leetcode 挑戰 Day 05 [136. Single Number]
下一篇
Leetcode 挑戰 Day 07 [118. Pascal's Triangle]
系列文
試煉之地 Leetcode 的挑戰19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言